package demo.java.time;

import org.junit.Test;

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

/**
 * <h2>ZoneId 与 ZoneOffset 的核心概念</h2>
 * <li>ZoneId（时区 ID），表示一个地理区域的时区（如 Asia/Shanghai、America/New_York），包含该区域的完整时区规则（包括夏令时调整、历史偏移变更等）。
 * 不仅包含当前偏移量，还包含该时区在不同时期的偏移规则（如某地区可能在夏季使用 +02:00，冬季使用 +01:00）。
 *
 * <li>ZoneOffset（时区偏移量），表示 UTC 时间与本地时间的固定偏移量（如 +08:00、-05:00），仅包含小时和分钟的差值，是一个固定值。
 * 不包含时区规则（如夏令时调整），仅表示 “与 UTC 的固定差距”。
 * 范围是 -18:00 到 +18:00（以 1 分钟为单位递增）。
 *
 * <h2>夏令时</h2>
 * 夏令时（Daylight Saving Time，DST），也叫夏时制，又称 “日光节约时制” 和 “夏令时间”，是一种为节约能源而人为规定地方时间的制度。
 * 在这一制度实行期间所采用的统一时间称为 “夏令时间”，一般在天亮早的夏季人为将时间调快一小时，可以使人早起早睡，减少照明量，以充分利用光照资源，从而节约照明用电。
 * <p>
 * 目前，全球约 40% 的国家实行夏令时，这些国家主要集中在北半球，尤其是高纬度地区。如：美国、加拿大、德国、瑞士、法国和意大利，还有 澳大利亚（位于南半球）
 */
public class ZoneDemo {


    public static final ZoneId ZONE_ID_SHANGHAI = ZoneId.of("Asia/Shanghai");
    public static final ZoneId ZONE_ID_NEWYORK = ZoneId.of("America/New_York");

    public static void main(String[] args) {
        // 上海时区（Asia/Shanghai）
        ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai");

        // 获取当前时间的偏移量
        Instant now = Instant.now();
        ZoneOffset shanghaiOffsetNow = shanghaiZone.getRules().getOffset(now);
        System.out.println(shanghaiOffsetNow); // 输出 +08:00（上海时区当前偏移）

        // 获取历史时间的偏移量（假设某时区曾调整过时区规则）
        Instant past = Instant.parse("2000-01-01T00:00:00Z");
        ZoneOffset shanghaiOffsetPast = shanghaiZone.getRules().getOffset(past);
        System.out.println(shanghaiOffsetPast); // 输出 +08:00（上海时区历史偏移）
    }

    public ZoneOffset zoneIdToOffset(ZoneId zoneId) {
        return zoneId.getRules().getOffset(Instant.now());
    }

    @Test
    public void test() {
        // 东八区偏移量
        ZoneOffset offset = ZoneOffset.of("+08:00");

        // 转换为 ZoneId（表示一个固定偏移的时区）
        ZoneId zoneFromOffset = offsetToZoneId(offset);
        System.out.println(zoneFromOffset); // 输出 UTC+08:00
    }

    public static ZoneId offsetToZoneId(ZoneOffset offset) {
        return ZoneId.ofOffset("UTC", offset);
    }
}
